<?php
declare (strict_types=1);

namespace app\common\model;

use app\common\model\BaseModel;
use think\facade\Cache;
use app\common\enum\{
    Setting as SettingEnum,
    file\Storage as StorageEnum
};
use think\facade\Request;

/**
 * 系统设置模型
 * Class Setting
 * @package app\common\model
 */
class Setting extends BaseModel
{
    // 定义表名
    protected $name = 'setting';
    // 定义主键
    protected $pk = 'key';

    /**
     * 获取指定项设置
     * @param string $key
     * @return array|mixed
     */
    public static function getItem(string $key)
    {
        $data = self::getAll();
        return isset($data[$key]) ? $data[$key]['values'] : [];
    }

    /**
     * 获取设置项信息
     * @param string $key
     * @return static|array|null
     */
    public static function detail(string $key)
    {
        $query = (new static)->getNewQuery();
        return $query->where('key', '=', $key)->find();
    }

    /**
     * 全局缓存: 系统设置
     * @return array
     */
    public static function getAll(): array
    {
        $model = new static;
        if (!$data = Cache::get("setting")) {
            // 获取设置列表
            $setting = $model->getList();
            $data = $setting->isEmpty() ? [] : arrayColumn2Key($setting->toArray(), 'key');
            // 写入缓存中
            Cache::tag('cache')->set("setting", $data);
        }
        return resetOptions($model->defaultData(), $data);
    }

    /**
     * 获取设置列表
     * @return \think\Collection
     */
    private function getList(): \think\Collection
    {
        return $this->select();
    }

    /**
     * 默认配置
     * @return array
     */
    public function defaultData(): array
    {
        return [
            // 上传设置
            SettingEnum::STORAGE => [
                'key' => SettingEnum::STORAGE,
                'describe' => '上传设置',
                'values' => [
                    'default' => StorageEnum::LOCAL,
                    'engine' => [
                        StorageEnum::LOCAL => null,
                        StorageEnum::QINIU => [
                            'bucket' => '',
                            'access_key' => '',
                            'secret_key' => '',
                            'domain' => 'http://'
                        ],
                        StorageEnum::ALIYUN => [
                            'bucket' => '',
                            'access_key_id' => '',
                            'access_key_secret' => '',
                            'domain' => 'http://'
                        ],
                        StorageEnum::QCLOUD => [
                            'bucket' => '',
                            'region' => '',
                            'secret_id' => '',
                            'secret_key' => '',
                            'domain' => 'http://'
                        ],
                    ]
                ],
            ],
            // 账户注册设置
            SettingEnum::REGISTER => [
                'key' => SettingEnum::REGISTER,
                'describe' => '账户注册设置',
                'values' => [
                    'registerMethod' => 10,   // 默认注册方式: 10=>手机号+短信验证码
                    'isOauthMpweixin' => 1,   // 是否开启微信小程序一键授权登录
                    'isPersonalMpweixin' => 0,   // 微信小程序一键授权登录时填写用户昵称和头像
                    'isOauthMobileMpweixin' => 1,   // 是否开启微信小程序一键授权手机号（2023年8月26日起该接口收费）
                ],
            ],
            // 用户充值设置
            SettingEnum::RECHARGE => [
                'key' => SettingEnum::RECHARGE,
                'describe' => '用户充值设置',
                'values' => [
                    'is_entrance' => 1,     // 是否允许用户充值
                    'is_custom' => 1,       // 是否允许自定义金额
                    'lowest_money' => 10,   // 最低充值金额
                    'is_match_plan' => 1,   // 自定义金额是否自动匹配合适的套餐
                    'describe' => "1. 账户充值仅限微信在线方式支付，充值金额实时到账；\n" .
                        "2. 账户充值套餐赠送的金额即时到账；\n" .
                        "3. 账户余额有效期：自充值日起至用完即止；\n" .
                        "4. 若有其它疑问，可拨打客服电话400-000-1234",     // 充值说明
                    'reward_points' => 1,   // 充值赠送积分
                    'money2points'  => 100, // 1元对应积分
                ],
            ],
            // 积分设置
            SettingEnum::POINTS => [
                'key' => SettingEnum::POINTS,
                'describe' => SettingEnum::data()[SettingEnum::POINTS]['describe'],
                'values' => [
                    'points_name' => '积分',         // 积分名称自定义
                    // 积分说明
                    'describe' => "a) 积分不可兑现、不可转让,仅可在本平台使用;\n" .
                        "b) 您在本平台参加特定活动也可使用积分,详细使用规则以具体活动时的规则为准;\n" .
                        "c) 积分的数值精确到个位(小数点后全部舍弃,不进行四舍五入)\n" .
                        "d) 买家在完成该笔交易(订单状态为“已签收”)后才能得到此笔交易的相应积分,如购买商品参加店铺其他优惠,则优惠的金额部分不享受积分获取;",
                ],
            ],
            // APP/小程序主题设置
            SettingEnum::APP_THEME => [
                'key' => SettingEnum::APP_THEME,
                'describe' => 'APP/小程序主题设置',
                'values' => [
                    'gradualBtn'=> 1,         // 是否开启按钮渐变色
                    'mainBg'    => '#4e69fd', // 主背景颜色
                    'mainBg2'   => '#7891ff', // 主背景颜色 (渐变值)
                    'mainFg'    => '#fafaff', // 主前景颜色
                    'viceBg'    => '#e5e9ff', // 副背景颜色
                    'viceBg2'   => '#eff3ff', // 副背景颜色 (渐变值)
                    'viceFg'    => '#323264', // 副前景颜色
                    'mainText'  => '#32323c', // 主文字颜色
                    'viceText'  => '#646478', // 副文字颜色
                    'pageBg'    => '#f1f3f6', // 页面背景色
                    'matchColor'=> '#fa694e', // 配色
                ]
            ],
            // 客服设置
            SettingEnum::CUSTOMER => [
                'key' => SettingEnum::CUSTOMER,
                'describe' => '客服设置',
                'values' => [
                    'enabled' => 1,         // 是否启用在线客服
                    'provider' => 'mpwxkf', // 当前使用的客服方式
                    'kflink' => '',         // 客服链接
                    'corpid' => '',         // 企业ID
                    'kfphone' => '',        // 客服电话
                ]
            ],
            // 短信设置
            SettingEnum::SMS => [
                'key' => SettingEnum::SMS,
                'describe' => '短信设置',
                'values' => [
                    'default' => 'aliyun',
                    // 短信服务渠道
                    'engine' => [
                        // 阿里云
                        'aliyun' => [
                            'name' => '阿里云短信',
                            'website' => 'https://dysms.console.aliyun.com/dysms.htm',
                            'AccessKeyId' => '',
                            'AccessKeySecret' => '',
                            'sign' => ''   // 短信签名
                        ],
                        // 腾讯云
                        'qcloud' => [
                            'name' => '腾讯云短信',
                            'website' => 'https://console.cloud.tencent.com/smsv2',
                            'SdkAppID' => '',
                            'AccessKeyId' => '',
                            'AccessKeySecret' => '',
                            'sign' => ''   // 短信签名
                        ],
                        // 七牛云
                        'qiniu' => [
                            'name' => '七牛云短信',
                            'website' => 'https://portal.qiniu.com/sms/dashboard',
                            'AccessKey' => '',
                            'SecretKey' => '',
                        ],
                    ],
                    // 短信设置场景
                    'scene' => [
                        // 短信验证码
                        'captcha' => [
                            'name' => '短信验证码 (通知用户)',    // 场景名称
                            'isEnable' => false,     // 是否开启
                            'templateCode' => '',    // 模板ID
                            'content' => [
                                'aliyun' => '验证码${code}，您正在进行身份验证，若非本人操作，请勿泄露。',
                                'qiniu' => '验证码{1}，您正在进行身份验证，若非本人操作，请勿泄露。',
                                'qcloud' => '验证码${code}，您正在进行身份验证，若非本人操作，请勿泄露。',
                            ]
                        ],
                    ]
                ],
            ],
            // 微信小程序设置
            SettingEnum::WXAPP => [
                'key' => SettingEnum::WXAPP,
                'describe' => '微信小程序设置',
                'values' => [
                    'appid'     => '',
                    'appsecret' => '',
                    'share' => [
                        'title' => '',
                        'path' => 'pages/home/index',
                        'imageUrl' => '',
                        'imageUrl2' => ''
                    ],
                    'defaultAvatar' => Request::domain().'/static/img/avatar.png',
                ]
            ],
            // 支付设置
            SettingEnum::PAY => [
                'key' => SettingEnum::PAY,
                'describe' => SettingEnum::data()[SettingEnum::PAY]['describe'],
                'values' => [
                    'wechat' => [
                        'version' => 'v3',
                        'mchType' => 'normal',
                        'appId' => '',         //应用ID (AppID)
                        'mchId' => '',         //微信商户号 (MchId)
                        'apiKey' => '',        //支付密钥 (APIKEY)
                        'apiclientCert' => '', //证书文件 (CERT)
                        'apiclientKey' => '',  //证书文件 (KEY)
                        'platformCert' => ''   //平台证书
                    ],
                    "alipay" => [
                        'appId' => '',               //支付宝应用 (AppID)
                        'signType' => 'RSA2',        //签名算法 (signType)  RSA2,RSA
                        'signMode' => 10,            //加签模式  10:公钥证书,20:公钥
                        'alipayPublicKey' => '',     //支付宝公钥 (alipayPublicKey)
                        'appCertPublicKey' => '',    //应用公钥证书
                        'alipayCertPublicKey' => '', //支付宝公钥证书
                        'alipayRootCert' => '',      //支付宝根证书
                        'merchantPrivateKey' => ''   //应用私钥 (privateKey)
                    ]
                ]
            ]
        ];
    }
}
